فارسی

یاد بگیرید چگونه تایپ‌های تایپ‌اسکریپت شخص ثالث را با افزودن قابلیت به ماژول‌ها توسعه دهید و از ایمنی تایپ و تجربه بهتر توسعه‌دهنده اطمینان حاصل کنید.

افزودن قابلیت به ماژول‌های تایپ‌اسکریپت: توسعه‌دهی تایپ‌های شخص ثالث

قدرت تایپ‌اسکریپت در سیستم تایپ قوی آن نهفته است. این سیستم به توسعه‌دهندگان این امکان را می‌دهد که خطاها را زودتر تشخیص دهند، قابلیت نگهداری کد را بهبود بخشند و تجربه کلی توسعه را ارتقا دهند. با این حال، هنگام کار با کتابخانه‌های شخص ثالث، ممکن است با سناریوهایی روبرو شوید که در آن‌ها تعاریف تایپ ارائه شده ناقص هستند یا کاملاً با نیازهای خاص شما مطابقت ندارند. اینجاست که افزودن قابلیت به ماژول (module augmentation) به کمک می‌آید و به شما این امکان را می‌دهد که تعاریف تایپ موجود را بدون تغییر کد اصلی کتابخانه، توسعه دهید.

افزودن قابلیت به ماژول (Module Augmentation) چیست؟

افزودن قابلیت به ماژول یک ویژگی قدرتمند تایپ‌اسکریپت است که به شما امکان می‌دهد تایپ‌های تعریف‌شده در یک ماژول را از یک فایل دیگر اضافه یا اصلاح کنید. این کار را مانند افزودن ویژگی‌ها یا سفارشی‌سازی‌های اضافی به یک کلاس یا اینترفیس موجود به شیوه‌ای ایمن از نظر تایپ در نظر بگیرید. این ویژگی به ویژه زمانی مفید است که نیاز به توسعه تعاریف تایپ کتابخانه‌های شخص ثالث دارید، مانند افزودن پراپرتی‌ها، متدها یا حتی بازنویسی موارد موجود برای انطباق بهتر با نیازمندی‌های اپلیکیشن شما.

برخلاف ادغام تعاریف (declaration merging)، که به طور خودکار زمانی رخ می‌دهد که دو یا چند تعریف با نام یکسان در یک محدوده (scope) یافت شوند، افزودن قابلیت به ماژول به طور صریح یک ماژول خاص را با استفاده از سینتکس declare module هدف قرار می‌دهد.

چرا از افزودن قابلیت به ماژول استفاده کنیم؟

در اینجا دلایلی که چرا افزودن قابلیت به ماژول ابزاری ارزشمند در زرادخانه تایپ‌اسکریپت شماست، آورده شده است:

افزودن قابلیت به ماژول چگونه کار می‌کند؟

مفهوم اصلی حول محور سینتکس declare module می‌چرخد. ساختار کلی آن به صورت زیر است:


declare module 'module-name' {
  // Type declarations to augment the module
  interface ExistingInterface {
    newProperty: string;
  }
}

بیایید اجزای کلیدی را بررسی کنیم:

مثال‌های عملی

مثال ۱: توسعه یک کتابخانه شخص ثالث (Moment.js)

فرض کنید از کتابخانه Moment.js برای کار با تاریخ و زمان استفاده می‌کنید و می‌خواهید یک گزینه قالب‌بندی سفارشی برای یک منطقه خاص (مثلاً برای نمایش تاریخ‌ها در ژاپن با فرمت خاص) اضافه کنید. تعاریف تایپ اصلی Moment.js ممکن است شامل این فرمت سفارشی نباشد. در اینجا نحوه استفاده از افزودن قابلیت به ماژول برای اضافه کردن آن آمده است:

  1. نصب تعاریف تایپ برای Moment.js:
    
    npm install @types/moment
    
  2. ایجاد یک فایل تایپ‌اسکریپت (مثلاً moment.d.ts) برای تعریف افزوده خود:
    
    // moment.d.ts
    import 'moment'; // وارد کردن ماژول اصلی برای اطمینان از در دسترس بودن آن
    
    declare module 'moment' {
      interface Moment {
        formatInJapaneseStyle(): string;
      }
    }
    
  3. پیاده‌سازی منطق قالب‌بندی سفارشی (در یک فایل جداگانه، مثلاً moment-extensions.ts):
    
    // moment-extensions.ts
    import * as moment from 'moment';
    
    moment.fn.formatInJapaneseStyle = function(): string {
      // منطق قالب‌بندی سفارشی برای تاریخ‌های ژاپنی
      const year = this.year();
      const month = this.month() + 1; // ماه از 0 شروع می‌شود
      const day = this.date();
      return `${year}年${month}月${day}日`;
    };
    
  4. استفاده از شیء Moment.js توسعه‌یافته:
    
    // app.ts
    import * as moment from 'moment';
    import './moment-extensions'; // وارد کردن پیاده‌سازی
    
    const now = moment();
    const japaneseFormattedDate = now.formatInJapaneseStyle();
    console.log(japaneseFormattedDate); // خروجی: به عنوان مثال، 2024年1月26日
    

توضیح:

مثال ۲: افزودن پراپرتی به شیء Request (Express.js)

فرض کنید از Express.js استفاده می‌کنید و می‌خواهید یک پراپرتی سفارشی به شیء Request اضافه کنید، مانند userId که توسط یک میان‌افزار (middleware) پر می‌شود. در اینجا نحوه دستیابی به این هدف با استفاده از افزودن قابلیت به ماژول آمده است:

  1. نصب تعاریف تایپ برای Express.js:
    
    npm install @types/express
    
  2. ایجاد یک فایل تایپ‌اسکریپت (مثلاً express.d.ts) برای تعریف افزوده خود:
    
    // express.d.ts
    import 'express'; // وارد کردن ماژول اصلی
    
    declare module 'express' {
      interface Request {
        userId?: string;
      }
    }
    
  3. استفاده از شیء Request توسعه‌یافته در میان‌افزار خود:
    
    // middleware.ts
    import { Request, Response, NextFunction } from 'express';
    
    export function authenticateUser(req: Request, res: Response, next: NextFunction) {
      // منطق احراز هویت (مثلاً تأیید یک JWT)
      const userId = 'user123'; // مثال: استخراج شناسه کاربر از توکن
      req.userId = userId; // اختصاص شناسه کاربر به شیء Request
      next();
    }
    
  4. دسترسی به پراپرتی userId در کنترل‌کننده‌های مسیر (route handlers):
    
    // routes.ts
    import { Request, Response } from 'express';
    
    export function getUserProfile(req: Request, res: Response) {
      const userId = req.userId;
      if (!userId) {
        return res.status(401).send('Unauthorized');
      }
    
      // بازیابی پروفایل کاربر از پایگاه داده بر اساس userId
      const userProfile = { id: userId, name: 'John Doe' }; // مثال
      res.json(userProfile);
    }
    

توضیح:

مثال ۳: افزودن اتریبیوت‌های سفارشی به عناصر HTML

هنگام کار با کتابخانه‌هایی مانند React یا Vue.js، ممکن است بخواهید اتریبیوت‌های سفارشی به عناصر HTML اضافه کنید. افزودن قابلیت به ماژول می‌تواند به شما در تعریف تایپ‌های این اتریبیوت‌های سفارشی کمک کند و ایمنی تایپ را در تمپلیت‌ها یا کد JSX شما تضمین کند.

فرض کنیم از React استفاده می‌کنید و می‌خواهید یک اتریبیوت سفارشی به نام data-custom-id به عناصر HTML اضافه کنید.

  1. ایجاد یک فایل تایپ‌اسکریپت (مثلاً react.d.ts) برای تعریف افزوده خود:
    
    // react.d.ts
    import 'react'; // وارد کردن ماژول اصلی
    
    declare module 'react' {
      interface HTMLAttributes extends AriaAttributes, DOMAttributes {
        "data-custom-id"?: string;
      }
    }
    
  2. استفاده از اتریبیوت سفارشی در کامپوننت‌های React خود:
    
    // MyComponent.tsx
    import React from 'react';
    
    function MyComponent() {
      return (
        
    This is my component.
    ); } export default MyComponent;

توضیح:

بهترین روش‌ها برای افزودن قابلیت به ماژول

اشتباهات رایج و نحوه جلوگیری از آن‌ها

مزایای استفاده از افزودن قابلیت به ماژول

استفاده از افزودن قابلیت به ماژول در تایپ‌اسکریپت چندین مزیت کلیدی را فراهم می‌کند:

نتیجه‌گیری

افزودن قابلیت به ماژول در تایپ‌اسکریپت یک تکنیک قدرتمند برای توسعه و سفارشی‌سازی تعاریف تایپ از کتابخانه‌های شخص ثالث است. با استفاده از این قابلیت، می‌توانید اطمینان حاصل کنید که کد شما ایمن از نظر تایپ باقی می‌ماند، تجربه توسعه‌دهنده را بهبود می‌بخشید و از تکرار کد جلوگیری می‌کنید. با پیروی از بهترین روش‌ها و اجتناب از اشتباهات رایج مورد بحث در این راهنما، می‌توانید به طور مؤثر از افزودن قابلیت به ماژول برای ایجاد اپلیکیشن‌های تایپ‌اسکریپت قوی‌تر و قابل نگهداری‌تر استفاده کنید. این ویژگی را بپذیرید و پتانسیل کامل سیستم تایپ تایپ‌اسکریپت را آزاد کنید!

افزودن قابلیت به ماژول‌های تایپ‌اسکریپت: توسعه‌دهی تایپ‌های شخص ثالث | MLOG